import { _decorator, Animation, Collider2D, Component, Contact2DType, EventTouch, Input, input, instantiate, IPhysics2DContact, Node, Prefab, Vec2, Vec3 } from 'cc';
import { prward1, prwardType } from './prward1';
const { ccclass, property } = _decorator;

enum launchMode {
    single = 1, // 单发
    double = 2, // 双发
    triple = 3, // 三发
};

@ccclass('playerMove')
export class playerMove extends Component {
    @property
    shootRate: number = 0.5; // 射击频率
    timer: number = 0; // 射击计时器

    @property(Prefab)
    bullet1Prefab: Prefab = null; // 子弹预制体

    @property(Prefab)
    bullet2Prefab: Prefab = null; // 子弹预制体

    @property(Node)
    bulletOnePosition: Node = null; // 获取飞机中的空节点，子弹生成位置

    @property(Node)
    bulletTwo1Position: Node = null; // 获取飞机中的空节点，子弹生成位置

    @property(Node)
    bulletTwo2Position: Node = null; // 获取飞机中的空节点，子弹生成位置

    @property(Node)
    bulletPrent: Node = null; // 获取飞机中的空节点，子弹生成位置的父节点

    @property
    launchMode: launchMode = launchMode.single; // 射击模式

    @property
    bulletMoveSpeed: number = 1; // 设置子弹的速度倍数

    @property
    selfLife: number = 3; // 玩家生命值

    @property
    playerHitAnimation: string = ''; // 受伤后动画组件

    @property
    playerDownAnimation: string = ''; // 玩家死亡动画组件

    @property(Animation)
    anim: Animation = null; // 敌机动画组件


    player_Hit: Animation = null; // 玩家受伤动画组件

    player_Down: Animation = null; // 玩家死亡动画组件

    collider: Collider2D = null;    // 碰撞组件

    rewardTimer: number = 5; // 奖励时间
    rewardTimerCount: number = 0; // 奖励计时器

    UnrivalledTime: number = 1; // 玩家无敌时间
    Unrivalledtimer: number = 0; // 无敌计时器

    protected _isUnrivalled: boolean = false; // 玩家是否无敌标志



    protected _isDeath: boolean = false; // 玩家是否死亡标志

    protected onLoad(): void {

        this.collider = this.getComponent(Collider2D);  // 获取碰撞组件
        if (this.collider) {
            this.collider.on(Contact2DType.BEGIN_CONTACT, this.onBeginContact, this);
        } else {
            console.log('组件未找到')
        }

        input.on(Input.EventType.TOUCH_MOVE, this.onTouchMove, this);
    }

    onBeginContact(selfCollider: Collider2D, otherCollider: Collider2D, contact: IPhysics2DContact | null) {
        let isPrward = otherCollider.getComponent(prward1);     // 获取奖励组件
        // 检查是否是奖励组件
        if (isPrward) {

            switch (isPrward.prwardType) {
                case prwardType.prward1: // 奖励类型1
                    console.log('奖励类型1');
                    this.dubleShoot(); // 双发射击
                    break;
                case prwardType.prward2: // 奖励类型2
                    this.clearTotal(); // 清除所有敌人

                    console.log('奖励类型2');
                    break;
            }
        } else {
            this.onContactEnemy(); // 调用碰撞处理方法
        }




    }

    /**
     * 清除所有敌人奖励
     */
    clearTotal() {

    }

    /**
     * 双发射击奖励
     */
    dubleShoot() {
        this.rewardTimerCount = 0; // 重置奖励计时器
        this.launchMode = launchMode.double; // 设置射击模式为双发
    }

    onContactEnemy() {
        if (this._isUnrivalled) return; // 如果无敌，直接返回
        this._isUnrivalled = true; // 设置无敌状态


        this.selfLife -= 1; // 每次碰撞减少1点生命值
        if (this.selfLife > 0) {
            // 播放受伤动画
            this.anim.play(this.playerHitAnimation);
        } else {
            // 播放死亡动画

            this.anim.play(this.playerDownAnimation);
            if (this.collider) {
                this.collider.enabled = false; // 禁用碰撞器，防止重复触发
            }
            this._isDeath = true; // 设置玩家死亡标志
        }

    }

    protected onDestroy(): void {
        input.off(Input.EventType.TOUCH_MOVE, this.onTouchMove, this);
    }


    /**
     * 触摸移动事件
     * @param event 
     */
    onTouchMove(event: EventTouch) {
        if (this._isDeath) return; // 如果玩家已经死亡，忽略触摸事件

        // 获取触摸点的位置
        const nodePosition = this.node.position;
        //
        let targetPosition = new Vec3(nodePosition.x + event.getDeltaX(), nodePosition.y + event.getDeltaY());



        if (targetPosition.x < -350) {
            targetPosition.x = -350;
            console.log('X坐标负数触发了')
        }
        if (targetPosition.x > 350) {
            targetPosition.x = 350;
            console.log('X坐标正数触发了')
        }

        if (targetPosition.y > 600) {
            targetPosition.y = 600;
            console.log('y坐标正数触发了')
        }

        if (targetPosition.y < -600) {
            targetPosition.y = -600;
            console.log('y坐标负数触发了')
        }

        this.node.setPosition(targetPosition);
    }

    protected update(dt: number): void {
        if (this._isDeath) return; // 如果玩家已经死亡，忽略更新

        if (this._isUnrivalled) {
            // 如果玩家处于无敌状态，更新无敌计时器
            this.Unrivalledtimer += dt;

            if (this.Unrivalledtimer >= this.UnrivalledTime) {

                this._isUnrivalled = false; // 重置无敌状态
                this.Unrivalledtimer = 0; // 重置计时器
            }
        }


        // 检查射击模式并调用相应的射击方法
        switch (this.launchMode) {
            case launchMode.single:
                this.launchModeOne(dt);
                break;
            case launchMode.double:
                this.launchModeTwo(dt);
                break;
            case launchMode.triple:
                this.launchModeOne(dt);
                this.launchModeTwo(dt);
                break;
            default:
                console.warn('未设置射击模式');
                break;
        }


    }

    launchModeOne(dt: number) {
        const deltaTime = this.timer + dt;
        if (deltaTime >= this.shootRate) {
            this.timer = 0;
            // 在这里添加射击逻辑
            let bullet1Prefab = instantiate(this.bullet1Prefab);
            this.bulletPrent.addChild(bullet1Prefab);
            // 设置子弹位置
            bullet1Prefab.setWorldPosition(this.bulletOnePosition.worldPosition);
        }
        else {
            this.timer = deltaTime;
        }
    }

    launchModeTwo(dt: number) {
        //奖励模式的计时器
        this.rewardTimerCount += dt;
        if (this.rewardTimerCount >= this.rewardTimer) {
            this.launchMode = launchMode.single; // 重置射击模式为单发
        }


        const deltaTime = this.timer + dt * this.bulletMoveSpeed; // 调整射击频率
        // 双发射击逻辑
        if (deltaTime >= this.shootRate) {
            this.timer = 0;
            // 在这里添加射击逻辑
            let bullet1Prefab = instantiate(this.bullet2Prefab);
            let bullet2Prefab = instantiate(this.bullet2Prefab);
            this.bulletPrent.addChild(bullet1Prefab);
            this.bulletPrent.addChild(bullet2Prefab);
            // 设置子弹位置
            bullet1Prefab.setWorldPosition(this.bulletTwo1Position.worldPosition);
            bullet2Prefab.setWorldPosition(this.bulletTwo2Position.worldPosition);
        }
        else {
            this.timer = deltaTime;
        }
    }
}

